from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from django import http

from meiduo_mall.utils.response_code import RETCODE
from verifications.libs.captcha.captcha import captcha
from . import constants
import random, logging
from celery_tasks.sms.tasks import send_sms_code
from verifications.libs.yuntongxun.ccp_sms import CCP
# Create your views here.


class SMSCodeView(View):
    """短信验证"""
    def get(self, request, mobile):
        """
        :param mobile:
        :return: JSON
        """

        # 接受参数,这里的key 值要和前段的key值保持一至,提取字符串所以用GET
        image_code_client = request.GET.get('image_code') # 数据类型是string
        uuid = request.GET.get('uuid')
        # 校验参数，不用单独校验image_code和uuid因为后面还会继续做比交
        if not all([image_code_client,uuid]):
            return http.HttpResponseForbidden('缺少必传的参数')

        # 主体逻辑
        # 创建redis的对象
        redis_conn = get_redis_connection('verify_code')
        # 判断用户是否频繁发送短信
        send_flag = redis_conn.get('send_flag_%s' % mobile)

        if send_flag:
            return http.JsonResponse({'code': RETCODE.THROTTLINGERR, 'errmsg': '短信发送过于频繁'})

        # ① 提取图形证码
        image_code_server = redis_conn.get('img_%s' % uuid) # 数据类型是bytes
        if image_code_server is None:
            return http.JsonResponse({'code':RETCODE.IMAGECODEERR, 'errmsg': '输入图形验证码已失效'})
        # ② 删除图形验证码
        redis_conn.delete('img_%s' % uuid)
        # ③ 对比图形验证码
        image_code_server= image_code_server.decode() # 将数据转成bytes 在比较
        if image_code_client.lower() != image_code_server.lower(): # 为了方便比较，讲数据统一转成小写再进行比较
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '输入图形验证码有误' })

        # ④ 生成短信验证码,是是有随机6位数字形成的，所以用到random直接从标准库中导入
        sms_code = '%06d' % random.randint(0, 999999)
        # 创建日志输出器
        logger = logging.getLogger( 'django' )
        logger.info(sms_code)
        # ⑤ 保存短信验证码
        # redis_conn.setex('sms_%s' % mobile, constants.IMAGE_CODE_REDIS_EXPIRES, sms_code)
        # # 保存发送验证码的标记
        # redis_conn.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        # 创建管道
        pl = redis_conn.pipeline()
        # 将命令添加到队列中
        # 保存短信验证码
        pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        #  保存发送短信验证码标记
        pl.setex('sms_flag_%s'% mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        # 执行
        pl.execute()

        # ⑤ 发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code, constants.IMAGE_CODE_REDIS_EXPIRES // 60 ], constants.SEND_SMS_TEMPLATE_ID)
        send_sms_code.delay(mobile,sms_code) # 千万不要忘记写delay这是固定写法

        # 响应结果

        return http.JsonResponse({'code': RETCODE.OK, 'errmasg': '短信发送成功'})


class ImageCodeView(View):
    """图形验证码"""

    def get(self, request, uuid):
        """
        :param uuid: 通用唯一识别码，用于唯一标识该图形验证码属于哪个用户的
        :return: image/jpg
        """
        # 实现主体业务逻辑：生成，保存，响应图形验证码
        # 生成图形验证码
        text, image = captcha.generate_captcha()

        # 保存图形验证码
        redis_conn = get_redis_connection('verify_code')
        # redis_conn.setex('key', 'expires', 'value'),img_%s 只是给uuid 这个key设置标记
        redis_conn.setex('img_%s' % uuid, constants.IMAGE_CODE_REDIS_EXPIRES, text)

        # 响应图形验证码 ,(响应体，数据类型)
        return http.HttpResponse(image, content_type='image/jpg')